/**
 * @file MeshProcessor.h
 * @brief 网格处理器类的声明
 * 
 * 提供了节点间属性插值的核心功能，特性包括：
 * 1. 高性能节点数据读取和处理
 * 2. 并行化的插值计算
 * 3. 基于KD树的快速空间搜索
 * 4. 自适应插值算法选择
 * 5. SIMD优化的数值计算
 */
#pragma once
#include <string>
#include "GridStructs.h"
#include "KDTree.h"

class MeshProcessor
{
public:
    /**
     * @brief 构造函数
     * @param known_nodes_file 已知节点文件路径
     * @param unknown_nodes_file 未知节点文件路径
     * @param output_file 输出结果文件路径
     * 
     * 初始化网格处理器：
     * 1. 设置文件路径
     * 2. 配置OpenMP线程数
     * 3. 预分配内存资源
     */
    MeshProcessor(const std::string &known_nodes_file,
                 const std::string &unknown_nodes_file,
                 const std::string &output_file);

    /**
     * @brief 执行节点处理的主函数
     * @throw std::exception 当处理过程中出现错误时抛出异常
     * 
     * 处理流程：
     * 1. 读取已知节点数据
     * 2. 读取未知节点数据
     * 3. 构建KD树并执行插值
     * 4. 保存结果到文件
     */
    void process();

    /**
     * @brief 设置K近邻搜索的邻居数量
     * @param k 需要使用的近邻点数量
     * 
     * 配置插值计算时使用的最近邻点数量，
     * 该值影响插值结果的精度和计算性能
     */
    static void setKNearestPoints(size_t k);

private:
    // 文件路径成员
    std::string known_nodes_file;    ///< 已知节点文件路径
    std::string unknown_nodes_file;  ///< 未知节点文件路径
    std::string output_file;         ///< 输出结果文件路径

    // 数据成员
    std::vector<NodeProperty> known_nodes;  ///< 已知节点数据
    std::vector<Point3D> unknown_nodes;     ///< 未知节点坐标
    std::vector<Result> results;            ///< 插值计算结果

    // 处理相关成员
    KDTree kdtree;                    ///< 用于空间搜索的KD树实例
    static size_t K_NEAREST_POINTS;   ///< K近邻搜索的邻居数量

    /**
     * @brief 执行插值计算
     * 
     * 插值处理流程：
     * 1. 构建已知节点的KD树
     * 2. 使用线程本地存储优化并行处理
     * 3. 对目标点进行分块处理提高缓存命中
     * 4. 执行K近邻搜索和插值计算
     * 5. 收集并��储结果
     */
    void performInterpolation();

    /**
     * @brief 计算目标点的插值结果
     * @param target 目标点坐标
     * @param neighbors K个最近邻点及其距离
     * @return 返回插值结果S1值
     * 
     * 使用改进的IDW算法：
     * 1. 处理特殊情况(距离为0)
     * 2. SIMD优化的权重计算
     * 3. 并行化的数值计算
     */
    double calculateInterpolation(
        const Point3D &target,
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);

    /**
     * @brief 处理数据块
     * @param start 起始索引
     * @param end 结束索引
     * @param chunk_results 块结果存储
     * 
     * 并行处理策略：
     * 1. 使用线程本地存储
     * 2. 分块处理提高缓存效率
     * 3. 批量结果收集减少锁竞争
     */
    void processChunk(size_t start, size_t end,
                     std::vector<Result> &chunk_results);
}; 